package com.youxin.foundation.utils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 注解方法使用
 * @author yingde.cao
 *
 */
public class AnnotationUtils {
	/**
	 * 类字段是否使用注解类
	 * @param cls
	 * @param annotaionClass
	 * @return
	 */
	public static <T extends Annotation> boolean isFieldUsingAnnotaion(Class<?> cls,Class<T> annotaionClass)
	{
		//annotaionClass.isAnnotationPresent(annotationClass)
		Field[] fields=cls.getFields();
		for(Field field:fields)
		{
			T t=field.getAnnotation(annotaionClass);
			if(t!=null)
			{
				return true;
			}			
		}
		return false;
	}
	/**
	 * 获取类字段注解
	 * @param cls
	 * @param annotaionClass
	 * @return
	 */
	public static <T extends Annotation> T getFieldAnnotaion(Class<?> cls,Class<T> annotaionClass)
	{
		Field[] fields=cls.getFields();
		for(Field field:fields)
		{
			T t=field.getAnnotation(annotaionClass);
			if(t!=null)
			{
				return t;
			}			
		}
		return null;
	}
	
	
	/**
	 * 获取方法内的注解
	 * @param cls
	 * @param annotaionClass
	 * @return
	 */
	public static <T extends Annotation> T getMethodAnnotaion(Class<?> cls,Class<T> annotaionClass)
	{
		Method[] methods=cls.getMethods();
		for(Method method:methods)
		{
			T t=method.getAnnotation(annotaionClass);
			if(t!=null)
			{
				return t;
			}			
		}
		return null;
	}
	
	/**
	 * 类方法是否使用注解类
	 * @param cls
	 * @param annotaionClass
	 * @return
	 */
	public static <T extends Annotation> boolean isMethodUsingAnnotaion(Class<?> cls,Class<T> annotaionClass)
	{
		Method[] methods=cls.getMethods();
		for(Method method:methods)
		{
			T t=method.getAnnotation(annotaionClass);
			if(t!=null)
			{
				return true;
			}			
		}
		return false;
	}
	
	/**
	 * 类方法是否使用注解类
	 * @param cls
	 * @param annotaionClass
	 * @return
	 */
	public static <T extends Annotation> boolean isClassUsingAnnotaion(Class<?> cls,Class<T> annotaionClass)
	{
		T t=cls.getAnnotation(annotaionClass);
		return t!=null?true:false;
		
	}
	
}
